//package com.xm.webSocket;
//
//import com.xm.common.constant.CommonConstant;
//import jakarta.websocket.OnClose;
//import jakarta.websocket.OnError;
//import jakarta.websocket.OnOpen;
//import jakarta.websocket.Session;
//import jakarta.websocket.server.ServerEndpoint;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.lang3.StringUtils;
//import org.springframework.web.bind.annotation.RestController;
//
//import java.io.BufferedReader;
//import java.io.FileReader;
//import java.io.IOException;
//import java.io.RandomAccessFile;
//import java.nio.charset.Charset;
//import java.nio.charset.StandardCharsets;
//import java.nio.file.Files;
//import java.nio.file.Path;
//import java.nio.file.Paths;
//import java.util.ArrayList;
//import java.util.Arrays;
//import java.util.List;
//import java.util.Map;
//import java.util.concurrent.ConcurrentHashMap;
//import java.util.concurrent.Executors;
//import java.util.concurrent.ScheduledExecutorService;
//import java.util.concurrent.TimeUnit;
//import java.util.regex.Matcher;
//import java.util.regex.Pattern;
//
//@ServerEndpoint(value = "/websocket/logging")
//@Slf4j
//@RestController
//public class WebSocketController {
//    private static final Map<String, Session> sessionMap = new ConcurrentHashMap<>();
//    public static Integer length = 0;
//    private static final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(2);
//
//    @OnOpen
//    public void onOpen(Session session) {
//        sessionMap.put(session.getId(), session);
//
//        executorService.scheduleAtFixedRate((Runnable) () -> {
//            if (sessionMap.containsKey(session.getId())) {
//                sendLogData(session);
//            }
//        }, 0, 500, TimeUnit.MILLISECONDS);
//    }
//
//    @OnClose
//    public void onClose(Session session) {
//        sessionMap.remove(session.getId());
//    }
//
//    @OnError
//    public void onError(Session session, Throwable error) {
//        log.error("WebSocket error on session {}: {}", session.getId(), error.getMessage(), error);
//    }
//
//    /**
//     * 发送日志数据给指定的会话
//     * 此方法读取日志文件，并发送自上次发送以来的新日志行给指定的会话
//     *
//     * @param session 与客户端的一个会话，用于发送日志数据
//     */
//    private void sendLogData(Session session) {
//        String filePath = CommonConstant.FILE_PATH;
//        int lastLineNumber = length;
//
//        try (BufferedReader reader = Files.newBufferedReader(Paths.get(filePath), StandardCharsets.UTF_8)) {
//            int lineNumber = 0;
//            String line;
//            List<String> linesToSend = new ArrayList<>();
//
//            while ((line = reader.readLine()) != null) {
//                lineNumber++;
//                if (lineNumber > lastLineNumber) {
//                    linesToSend.add(line);
//                }
//                if (lineNumber - lastLineNumber >= 50) {
//                    break; // Limit the number of lines read in one go
//                }
//            }
//
//            if (!linesToSend.isEmpty()) {
//                formatAndSendLog(session, linesToSend.toArray(new String[0]));
//                length = lineNumber;
//            }
//        } catch (IOException e) {
//            log.error("Error reading log file: {}", e.getMessage(), e);
//        }
//    }
//
//    /**
//     * 解析数据格式
//     * @param session
//     * @param newLines
//     */
//    private void formatAndSendLog(Session session, String[] newLines) {
//
//        String logPattern = ".*?\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}[\\+\\-]\\d{2}:\\d{2}  .*? --- .*? : (.*)";
//
//        for (int i = 0; i < newLines.length; i++) {
//            String line = escapeHtml(newLines[i]);
//            Matcher matcher = Pattern.compile(logPattern).matcher(line);
//            if (matcher.find()) {
//                line = matcher.group(1);
//            }
//            newLines[i] = line;
//        }
//
//        String result = StringUtils.join(newLines, "<br/>");
//        if (newLines.length == 1) {
//            result += "<br/>";
//        }
//
//        send(session, result);
//    }
//
//    private String escapeHtml(String line) {
//        return line.replace("&", "&amp;")
//                .replace("<", "&lt;")
//                .replace(">", "&gt;")
//                .replace("\"", "&quot;");
//    }
//
//    /**
//     * 执行发送方法
//     * @param session
//     * @param message
//     */
//    private void send(Session session, String message) {
//        try {
//            session.getBasicRemote().sendText(message);
//        } catch (IOException e) {
//            log.error("Error sending message to session {}: {}", session.getId(), e.getMessage(), e);
//        }
//    }
//}